home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-02-07 | 59.8 KB | 2,366 lines |
- This is an official patch to nn release 6.4
- -------------------------------------------
-
- PATCH #13
-
- Priority: MEDIUM
-
-
- This patch contains mainly minor bugs fixes and some new features.
- Specifically, when new groups are created, the GROUPS file is now
- rewritten rather than just appended to; this is done to minimize the
- risk that the MASTER and GROUPS files lose their 1:1 relationship.
-
- The handling of the GATE file used to communicate between nnadmin and
- nnmaster has been improved significantly to detect and possily fix
- problems where permissions would prevent successful communication
- (typically preventing expire on the database).
-
- The decoding of Date: headers has been reworked to parse more time
- zones (and do it correctly), to make it easier to add new time zones,
- and to make it handle 4 digit years.
-
- The keyboard input handling is also completely reworked to support
- sys5 network environments where the VMIN/VTIME mechanism is often
- unreliable, and consequently multi-keys are not recognized properly.
-
- The "enter last read group" feature introduced in patch 12 where nn
- will now automatically wrap around the presentation sequence to allow
- you to read groups before the remembered group.
-
- This patch includes some support for Apollo's Domain/OS and a new
- s-apollo.h file. The patch 2.0 program should be able to create this
- file - if it can't, get a newer version of patch. However, you can
- ignore any complains from patch about not being able to create the
- conf directory (it already exists).
-
- As usual, all changes are described in the updated RELEASE_NOTES file
- (read that for more details about this patch). Thanks to all who
- reported bugs and provided fixes.
-
- To apply this patch, use nn's :patch command, or run this command from
- the shell in the root of the nn source tree:
- patch -p0 < this-article
-
- Then run "make all" and "./inst u".
-
- ++Kim Storm
-
- ===================================================================
-
- *** ./LAST/MANIFEST Sun May 6 18:19:12 1990
- --- MANIFEST Wed Jan 30 18:23:07 1991
- ***************
- *** 36,41 ****
- --- 36,42 ----
- conf/m-vax.h 22 For VAX family
- conf/s-3b1g.h 22 For 3b1 (unix-pc) with GCC.
- conf/s-aix221.h 14 For AIX 2.2.1
- + conf/s-apollo.h 6.4.13 For Apollo Domain/OS
- conf/s-aux1-1.h 22 For A/UX 1.1
- conf/s-bsd4-2.h 20 For 4.2 BSD and Ultrix systems
- conf/s-bsd4-3.h 22 For 4.3 BSD systems
- *** ./LAST/answer.c Wed Nov 7 15:54:22 1990
- --- answer.c Wed Nov 28 21:06:58 1990
- ***************
- *** 77,83 ****
- --- 77,87 ----
- now = cur_time();
- date = asctime(gmtime(&now));
- date[3] = date[7] = date[10] = date[19] = date[24] = NUL;
- + #ifdef NNTP_PATH_HOSTNAME
- + strncpy(host, NNTP_PATH_HOSTNAME, 64);
- + #else
- gethostname(host, 64);
- + #endif
-
- fprintf(t, "Path: %s!%s\n", host, user_name());
- fprintf(t, "Date: %s %s %s %s GMT\n", date+8, date+4, date+22, date+11);
- ***************
- *** 319,324 ****
- --- 323,330 ----
- extern char *nntp_get_filename();
- #endif
-
- + if (strcmp(prog, "COMPLETE") == 0) goto no_params;
- +
- param = open_file(relative(nn_directory, ".param"), OPEN_CREATE);
- if (param == NULL) {
- strcpy(delayed_msg, "cannot create .param file for aux script");
- ***************
- *** 381,386 ****
- --- 387,393 ----
-
- fclose(param);
-
- + no_params:
- stop_usage();
-
- /* OBS: relative() returns ptr to static data below */
- ***************
- *** 387,392 ****
- --- 394,400 ----
- *ap++ = "nnaux";
- *ap++ = script != NULL ? script : relative(lib_directory, "aux");
- *ap++ = prog;
- + *ap++ = temp_file;
- *ap++ = NULL;
-
- if (execute(SHELL, args, 1)) {
- ***************
- *** 455,460 ****
- --- 463,488 ----
- news_header_buffer nhbuf, dhbuf;
- flag_type st_flag = 0;
-
- + if (file_exist(relative(nn_directory, "hold.work"), (char *)NULL)) {
- + int ans;
- +
- + prompt("\1An uncompleted reponse exists\1 - complete now? ");
- + if ((ans = yes(1)) < 0) return 0;
- + if (ans) {
- + if (ah && ah->a_group) init_group(ah->a_group);
- + new_temp_file();
- + aux_sh(ah, (char *)NULL, "COMPLETE", (char *)NULL, (char *)NULL,
- + "Response%s posted", 0);
- + return 1;
- + }
- + prompt("Remove uncompleted reponse? ");
- + if ((ans = yes(1)) < 0) return 0;
- + if (ans) {
- + unlink(relative(nn_directory, "hold.work"));
- + unlink(relative(nn_directory, "hold.param"));
- + }
- + }
- +
- first_action = "edit";
- edit_message = 1;
- append_sig = 0;
- ***************
- *** 788,793 ****
- --- 816,822 ----
-
- ed_line = -1;
-
- + new_temp_file();
- if (aux_sh(ah, (char *)NULL, "cancel", news.ng_ident, current_group->group_name,
- "Article%s cancelled", 0))
- return -1;
- *** ./LAST/aux.sh Wed Nov 7 15:54:23 1990
- --- aux.sh Mon Dec 10 14:33:03 1990
- ***************
- *** 4,10 ****
- trap : 2 3
-
- PATH=/bin:$PATH
- - export PATH
-
- # Paramaters transferred from nn via .param file:
- # ART_ID Article id to cancel
- --- 4,9 ----
- ***************
- *** 31,47 ****
-
- CC=""
-
- ! . ${HOME}/.nn/.param
- !
- ! # first argument is operation to be performed:
- !
- ! OPERATION=$1
-
- # first we handle 'cancel'
-
- case "$OPERATION" in
- cancel)
- ! $INEWS -h << EOF > /tmp/nn$$c 2>&1
- Newsgroups: $GROUP
- Subject: cancel $ART_ID
- Control: cancel $ART_ID
- --- 30,52 ----
-
- CC=""
-
- ! if [ "$1" = "COMPLETE" ] ; then
- ! . ${HOME}/.nn/hold.param
- ! WORK="$2"
- ! EMPTY_CHECK=false
- ! cp ${HOME}/.nn/hold.work $WORK
- ! rm -f ${HOME}/.nn/hold.*
- ! else
- ! . ${HOME}/.nn/.param
- ! OPERATION=$1
- ! fi
-
- # first we handle 'cancel'
-
- case "$OPERATION" in
- cancel)
- ! TRACE="$2"
- ! $INEWS -h << EOF > $TRACE 2>&1
- Newsgroups: $GROUP
- Subject: cancel $ART_ID
- Control: cancel $ART_ID
- ***************
- *** 52,60 ****
- x=$?
- case $x in
- 0) ;;
- ! *) echo '' ; cat /tmp/nn$$c ; sleep 2 ;;
- esac
- ! rm -f /tmp/nn$$c
- exit $x
- ;;
- post|follow)
- --- 57,65 ----
- x=$?
- case $x in
- 0) ;;
- ! *) echo '' ; cat $TRACE ; sleep 2 ;;
- esac
- ! rm -f $TRACE
- exit $x
- ;;
- post|follow)
- ***************
- *** 85,90 ****
- --- 90,96 ----
- pr="$pr c)c"
- fi
- pr="$pr e)dit"
- + pr="$pr h)old"
- if [ -n "${SPELL_CHECKER}" ] ; then
- pr="$pr i)spell"
- fi
- ***************
- *** 180,185 ****
- --- 186,206 ----
- echo "Warning: no $LOOKFOR line in article"
- fi
- fi
- + ;;
- +
- + h*)
- + ${AWK} 'END{printf "Complete response later: (y) "}' < /dev/null
- + read act
- + case "$act" in
- + ""|y*)
- + cp $WORK ${HOME}/.nn/hold.work
- + cp ${HOME}/.nn/.param ${HOME}/.nn/hold.param
- + echo "OPERATION=$OPERATION" >> ${HOME}/.nn/hold.param
- + if [ -n "$COPY" ] ; then
- + rm -f $COPY
- + fi
- + exit 22 ;;
- + esac
- ;;
-
- i*)
- *** /dev/null Wed Feb 6 15:10:01 1991
- --- conf/s-apollo.h Wed Jan 30 19:45:56 1991
- ***************
- *** 0 ****
- --- 1,38 ----
- + /*
- + * This version is for Apollo Domain/OS systems running BSD 4.3.
- + * From: mmitchel@digi.lonestar.org (Mitch Mitchell)
- + */
- +
- + #include "s-bsd4-3.h"
- +
- + /*
- + * special sleep function that terminates following
- + * the receipt of a signal (needed for BSD Unix).
- + */
- +
- + #define HAVE_HARD_SLEEP
- +
- + /*
- + * Specify where the Korne Shell is. (instead of Borne Shell)
- + * The Bourne Shell is somewhat unreliable (at SR10.2).
- + */
- +
- + #ifdef SHELL
- + #undef SHELL
- + #endif
- + #define SHELL "/bin/ksh"
- +
- + /*
- + * Allow specification of file names to begin with a double
- + * slash "//" so that Apollo node names of form "//node" can
- + * occur in folder and file specifications.
- + */
- +
- + #define ALLOW_LEADING_DOUBLE_SLASH
- +
- + /*
- + * Cause nnmaster to keep a CLIENT copy of the MASTER file to overcome
- + * problems with network write access.
- + */
- +
- + #define APOLLO_DOMAIN_OS
- *** ./LAST/conf/s-bsd4-2.h Mon Apr 23 18:32:50 1990
- --- conf/s-bsd4-2.h Wed Nov 28 13:36:54 1990
- ***************
- *** 56,67 ****
- #undef SIGNAL_HANDLERS_ARE_VOID /* */
-
- /*
- - * Define MICRO_ALARM to timeout in 0.1 seconds if possible
- - */
- -
- - #define MICRO_ALARM() alarm(1) /* could use setitimer ... */
- -
- - /*
- * Define if your system has BSD like job control (SIGTSTP works)
- */
-
- --- 56,61 ----
- *** ./LAST/conf/s-bsd4-3.h Sat Mar 31 23:13:01 1990
- --- conf/s-bsd4-3.h Wed Nov 28 15:03:12 1990
- ***************
- *** 5,15 ****
- #include "s-bsd4-2.h"
-
- /*
- ! * Define MICRO_ALARM to timeout in 0.1 seconds if possible
- */
-
- ! #undef MICRO_ALARM
- ! #define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
-
- /*
- * Define if your system has a 4.3BSD like syslog library.
- --- 5,14 ----
- #include "s-bsd4-2.h"
-
- /*
- ! * Define if your system has a 4.3BSD like ualarm call.
- */
-
- ! #define HAVE_UALARM
-
- /*
- * Define if your system has a 4.3BSD like syslog library.
- *** ./LAST/conf/s-fortune.h Tue Sep 18 12:44:51 1990
- --- conf/s-fortune.h Wed Nov 28 13:36:53 1990
- ***************
- *** 60,72 ****
- #define RESET_SIGNAL_WHEN_CAUGHT /* */
-
- /*
- - * Define MICRO_ALARM to timeout in 0.1 seconds if possible
- - */
- -
- - #define MICRO_ALARM() alarm(1) /* System V */
- - /*#define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
- -
- - /*
- * Define if your system has BSD like job control (SIGTSTP works)
- */
-
- --- 60,65 ----
- *** ./LAST/conf/s-sunos3.h Sat Mar 31 23:13:02 1990
- --- conf/s-sunos3.h Wed Nov 28 15:03:12 1990
- ***************
- *** 9,16 ****
- #define HAVE_STRCHR
-
- /*
- ! * Define MICRO_ALARM to timeout after 0.1 seconds if possible
- */
-
- ! #undef MICRO_ALARM
- ! #define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
- --- 9,15 ----
- #define HAVE_STRCHR
-
- /*
- ! * Define if your system has a 4.3BSD like ualarm call.
- */
-
- ! #define HAVE_UALARM
- *** ./LAST/conf/s-sunos4-0.h Mon Apr 23 18:32:47 1990
- --- conf/s-sunos4-0.h Mon Nov 19 14:11:06 1990
- ***************
- *** 8,13 ****
- --- 8,17 ----
-
- #define HAVE_STRCHR /* */
-
- + #ifdef sun4
- + #define COMPILER_FLAGS -misalign
- + #endif
- +
- /*
- * Define if a signal handler has type void (see signal.h)
- */
- *** ./LAST/conf/s-template.h Tue Jun 12 11:46:27 1990
- --- conf/s-template.h Wed Jan 30 20:05:27 1991
- ***************
- *** 82,92 ****
- /* #define FAKE_INTERRUPT /* */
-
- /*
- ! * Define MICRO_ALARM to timeout in 0.1 seconds if possible
- ! * It is not used on systems with the TERMIO interface (sys V).
- */
-
- ! /*#define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
-
- /*
- * Define if your system has BSD like job control (SIGTSTP works)
- --- 82,102 ----
- /* #define FAKE_INTERRUPT /* */
-
- /*
- ! * Define HAVE_HARD_SLEEP if sending a SIGALRM isn't enough to
- ! * interrupt a sleep() call - typical symptom is that nnadmin W
- ! * doesn't wakeup the nnmaster.
- */
-
- ! /* #define HAVE_HARD_SLEEP /* BSD ? */
- !
- ! /*
- ! * Define HAVE_UALARM if your system has a 4.3 BSD like ualarm() call.
- ! * Else define MICRO_ALARM(n) to timeout in n/10 seconds if possible.
- ! * Don't define either if system only has the standard alarm() call.
- ! */
- !
- ! /* #define HAVE_UALARM /* BSD 4.3 */
- ! /* #define MICRO_ALARM(n) xxxx(n) /* */
-
- /*
- * Define if your system has BSD like job control (SIGTSTP works)
- *** ./LAST/conf/s-umipsb.h Wed May 2 09:38:44 1990
- --- conf/s-umipsb.h Wed Nov 28 15:03:12 1990
- ***************
- *** 57,67 ****
- #undef RESET_SIGNAL_WHEN_CAUGHT /* */
-
- /*
- ! * Define MICRO_ALARM to timeout in 0.1 seconds if possible
- */
-
- ! /*#define MICRO_ALARM() alarm(1) /* System V */
- ! #define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
-
- /*
- * Define if your system has BSD like job control (SIGTSTP works)
- --- 57,66 ----
- #undef RESET_SIGNAL_WHEN_CAUGHT /* */
-
- /*
- ! * Define if your system has a 4.3BSD like ualarm call.
- */
-
- ! #define HAVE_UALARM
-
- /*
- * Define if your system has BSD like job control (SIGTSTP works)
- *** ./LAST/config.h-dist Tue May 29 18:36:22 1990
- --- config.h-dist Wed Nov 28 21:06:58 1990
- ***************
- *** 86,91 ****
- --- 86,99 ----
-
- #define NNTP_MINI_INEWS_HEADER /* uses "broken" mini-inews */
-
- + /*
- + * Define NNTP_PATH_HOSTNAME to force a specific hostname into the
- + * Path: header generated when NNTP_MINI_INEWS_HEADER is defined.
- + * This is useful for multi-machine sites with one mail/news gateway.
- + */
- +
- + /* #define NNTP_PATH_HOSTNAME "puthostnamehere" /* */
- +
-
- /***************** OPERATING SYSTEM DEPENDENT DEFINITIONS *******************
- *
- *** ./LAST/db.c Wed Nov 7 15:54:25 1990
- --- db.c Wed Feb 6 14:57:00 1991
- ***************
- *** 140,145 ****
- --- 140,147 ----
-
- if (group_file != NULL && (mode & OPEN_CREATE)) {
- fprintf(group_file,
- + "#\n#\tNEVER MODIFY THIS FILE WHILE nnmaster IS RUNNING\n");
- + fprintf(group_file,
- "#\n#\tRUN 'nnmaster -G' AFTER MODIFYING THIS FILE\n");
- fprintf(group_file,
- "#\n#\tDO NOT REMOVE OR REORDER ANY LINES IN THIS FILE\n#\n");
- ***************
- *** 160,170 ****
- register group_header *gh;
- {
- char flags[16], *fp;
- - int was_open = (group_file != NULL);
- -
- - if (!was_open) open_groups(OPEN_UPDATE|MUST_EXIST);
-
- - fseek(group_file, (off_t)0, 2);
- if (gh->group_name[0] == NUL) {
- fputc('@', group_file);
- goto out;
- --- 162,168 ----
- ***************
- *** 197,205 ****
-
- out:
- fputc(NL, group_file);
- ! fflush(group_file);
-
- ! if (!was_open) close_groups();
- }
-
- static char *mk_archive_file(gh, cp, logerr)
- --- 195,223 ----
-
- out:
- fputc(NL, group_file);
- ! }
- !
- ! db_rewrite_groups(save_groups, group_list)
- ! int save_groups;
- ! group_header *group_list;
- ! {
- ! register group_header *gh;
-
- ! if (save_groups)
- ! if (save_old_file(relative(db_directory, "GROUPS"), "~") < 0)
- ! sys_error("Cannot rename GROUPS file");
- !
- ! open_groups(OPEN_CREATE|MUST_EXIST);
- !
- ! if (group_list != NULL) {
- ! for (gh = group_list->next_group; gh != NULL; gh = gh->next_group)
- ! db_append_group(gh);
- ! } else {
- ! Loop_Groups_Header(gh) {
- ! db_append_group(gh);
- ! }
- ! }
- ! close_groups();
- }
-
- static char *mk_archive_file(gh, cp, logerr)
- ***************
- *** 253,258 ****
- --- 271,278 ----
-
- if (trust_master) {
- cp = name + gh->group_name_length;
- + if (*cp == NUL || !isspace(*cp))
- + sys_error("MASTER/GROUPS conflict: %d/%s", gh->group_num, line);
- } else {
- /* parse GROUPS line */
-
- ***************
- *** 379,384 ****
- --- 399,416 ----
- static FILE *master_file = NULL;
- static int db_sequential = 0;
-
- + #ifdef APOLLO_DOMAIN_OS
- + static make_master_copy()
- + {
- + char client_path[FILENAME];
- + int n;
- +
- + strcpy(client_path,relative(db_directory, "CLIENT"));
- + if ((n = copy_file(relative(db_directory, "MASTER"), client_path, 0)) < 0)
- + log_entry('R', "Copy of MASTER to CLIENT failed (err=%d)", n);
- + }
- + #endif
- +
- open_master(mode)
- int mode;
- {
- ***************
- *** 387,392 ****
- --- 419,429 ----
-
- close_master();
-
- + #ifdef APOLLO_DOMAIN_OS
- + if (who_am_i != I_AM_MASTER && who_am_i != I_AM_ADMIN)
- + master_file = open_file(relative(db_directory, "CLIENT"), mode|MUST_EXIST);
- + else
- + #endif
- master_file = open_file(relative(db_directory, "MASTER"), mode|MUST_EXIST);
-
- db_sequential = 0;
- ***************
- *** 745,750 ****
- --- 782,790 ----
- #endif
-
- fflush(master_file);
- + #ifdef APOLLO_DOMAIN_OS
- + if (who_am_i == I_AM_MASTER) make_master_copy();
- + #endif
- return;
-
- err:
- ***************
- *** 825,830 ****
- --- 865,873 ----
- goto err;
- #endif
- fflush(master_file);
- + #ifdef APOLLO_DOMAIN_OS
- + if (who_am_i == I_AM_MASTER) make_master_copy();
- + #endif
- return;
-
- err:
- *** ./LAST/doc/RELEASE_NOTES Wed Nov 7 15:54:27 1990
- --- doc/RELEASE_NOTES Tue Feb 5 16:48:32 1991
- ***************
- *** 1325,1331 ****
- --- 1325,1445 ----
- From: itkin@guinan.transact.com (Steven List)
- Fixed: Patch #12 [answer.c]
-
- + Prog: nnmaster
- + Title: Index file was not closed if index was not found (file too short)
- + From: KFS
- + Fixed: Patch #12 [db.c] (documented here in patch #13)
- +
- + Prog: nnmaster, nn
- + Title: Time zone handling was incomplete and incorrect.
- + From: KFS based on information from many sources
- + Fixed: Patch #13 [pack_date.c]
- +
- + The eastern and western time zones were incorrect.
- + Time zone decoding now knows about "all" time zone formats, e.g.
- + -0800, Z+1, MET DST, UTC, UTC+0300, UT-1, CET
- +
- + Prog: nnmaster, nn
- + Title: Date parsing fail on four digit years and upper case month names
- + From: eggert@twinsun.com (Paul Eggert) + fix
- + Fixed: Patch #13 [pack_date.c]
- +
- + The fixed code will break on two digit years after 2087, but I
- + suppose it leaves some time to find a "complete" fix :-)
- +
- + Prog: nn
- + Title: Should wrap pres.seq. when nn is restarted with the last group read.
- + From: mike@geronimo.pcs.com (Mike Schroeder)
- + Fixed: Patch #13 [nn.c]
- +
- + Prog: nnmaster, nnadmin
- + Title: Should check for errors on GATE file and create with proper modes.
- + From: David Keegel <djk@cs.mu.OZ.AU>
- + Dave Davey <daved@physiol.su.oz.au>
- + Fixed: Patch #13 [proto.c master.c]
- +
- + Prog: nnmaster
- + Title: On some systems nnadmin W will not wakeup master (sleep problem).
- + From: mmitchel@digi.lonestar.org (Mitch Mitchell) + fix (heavily modified)
- + Fixed: Patch #13 [master.c s-template.h]
- +
- + Problem is that sleep() call is not based on SIGALRM, and thus cannot
- + be terminated by that. The fix provides a replacement for sleep if
- + HAVE_HARD_SLEEP is defined in the system's s- file.
- +
- + Prog: nnacct
- + Title: Accounting data are garbled on SUN4.
- + From: jhb@maths.su.oz.au (John Brownie) + fix
- + Fixed: Patch #13 [s-sunos4-0.h]
- +
- + There is some kind of structure alignment problem on the SUN-4 which
- + may give strange results... Compiling with -misalign fixes this.
- +
- + Prog: nn
- + Title: CR is always mapped to NL on non-TERMIO systems
- + From: david@wraith.cs.uow.edu.au (David E A Wilson) + fix
- + Fixed: Patch #13 [term.c]
- +
- + Prog: nn
- + Title: multi-keys are not reliably recognized via rlogin sessions.
- + From: marius@rhi.hi.is (Marius Olafsson) + fix (not used directly)
- + Fixed: Patch #13 [term.c variable.c nn.1 + several s- files]
- +
- + The basic keyboard handling has been rewritten to make input parsing
- + cleaner and more reliable. The new code will also preserve partial
- + multi-key sequences for use as normal input (the old code only
- + preserved the first character). There is also a new variable named
- + "multi-key-guard-time" to control the "between characters" timeout.
- +
- + Prog: nn
- + Title: TCSETAF is broken on pty's on many sysV systems and AIX
- + From: andy@xwkg.icom.com (Andrew H. Marrinson) + fix
- + marius@rhi.hi.is (Marius Olafsson) + fix
- + Fixed: Patch #13 [term.c]
- +
- + When rlogin'ed into some systems, the TCSETAF used to switch to and
- + from raw mode will incorrectly flush OUTPUT as well as input. The
- + workaround is to use TCSETAW which will not flush input. This
- + changes the behaviour of nn when using TERMIO and flow-control is
- + set: before nn would flush input after redrawing each menu or article
- + page - this is no longer done (which is probably better anyway!)
- +
- + Prog: nnmaster
- + Title: GROUPS and MASTER files are out of sync
- + From: lupe@alanya.Germany.Sun.COM (Lupe Christoph)
- + Fixed: Patch #13 [db.c global.c master.c]
- +
- + The GROUPS file is now rewritten rather than simply appended to when
- + new groups are added to the database. I'm not sure this really fixes
- + the problems, but at least it will take care of the situation where
- + the GROUPS file contains some trailing garbage (maybe left over from
- + a system crash).
- +
- + Prog: nn
- + Title: Compiling init.c gives "statement not reached" warnings.
- + From: Tim Evans <tkevans%fallst@wb3ffv.ampr.org>
- + Fixed: Patch #13 [init.c]
- +
- + Prog: nnadmin, nnmaster
- + Title: Problems with GATE file are not handled properly.
- + From: daved@physiol.su.oz.au (Dave Davey)
- + fsb@vitro.uucp (Steve Brailsford)
- + Fixed: Patch #13 [admin.c master.c proto.c]
- +
- + The most noticeable consequence of such problems is that expire is
- + not performed on the database.
- +
- + Prog: nn
- + Title: WRAP variable conflicts with termio on SunOS 4.1 sysV.
- + From: mills@ccu.umanitoba.ca (Gary Mills)
- + Fixed: Patch #13 [term.c term.h] -- wasn't used, just removed it
-
- + Prog: aux
- + Title: aux script puts /bin in front of PATH.
- + From: barrett@daisy.ee.und.ac.za (Alan P Barrett) + fix
- + Fixed: Patch #13 [aux.sh]
- +
- +
- New features since initial 6.4.0 release
- ----------------------------------------
-
- ***************
- *** 1770,1773 ****
- --- 1884,1935 ----
- 4: enter uncond even if no unread.
- If there are no unread articles, nn will actually locate the next
- group in the sequence starting with the remembered group.
- +
- + Prog: nn, nnmaster
- + Title: Improved support for Apollo Domain OS
- + From: mmitchel@digi.lonestar.org (Mitch Mitchell)
- + ianh@bhpmrl.oz.au (Ian Hoyle)
- + Added: Patch #13 [db.c folder.c global.c]
- +
- + Requires new s-apollo.h file which will be included in addendum 1.
- +
- + Prog: nn
- + Title: New "on first-use" construction to allow special actions for first
- + time users of nn (must be placed in global init file).
- + From: KFS on request from Michael Rawdon <rawdon@rex.cs.tulane.edu>
- + Added: Patch #13 [init.c nn.c]
- +
- + on first-use [all] For all new users of nn (no ~/.nn)
- + on first-use new For new news readers (no .newsrc)
- + on first-use old For old news readers (have .newsrc)
- +
- + To avoid adding missing groups to .newsrc on first invocation of nn
- + for a "convert" user, place this in the global init file:
- + on first-use old
- + set new-group-action 0
- + end
- +
- + Prog: nn
- + Title: New integer variable: check-db-update-time. If non-zero, nn will
- + give a warning check if database has not been updated by nnmaster
- + for the last c-d-u-t hours (default is 12 hours).
- + From: KFS
- + Added: Patch #13 [nn.c]
- +
- + Prog: nn
- + Title: Kill on number of references => new variable: kill-reference-count.
- + From: KFS on request from rolf@sparc1.isgs.uiuc.edu (Rolf Wilson) and
- + poulsen@sp1.csrd.uiuc.edu (David K. Poulsen).
- + Added: Patch #13 [kill.c variable.c]
- +
- + Prog: nn, aux
- + Title: A response can now be interrupted and completed later via h)old cmd.
- + From: KFS
- + Added: Patch #13 [answer.c aux.sh nn.1]
- +
- + Prog: nn, nnpost
- + Title: The hostname put into the mini-inews Path: header can now be
- + configureable via an optional NNTP_PATH_HOSTNAME macro in config.h
- + From: rdavis@convex.com (Ray Davis)
- + Added: Patch #13 [answer.c config.h-dist]
-
- *** ./LAST/folder.c Fri Oct 5 19:07:08 1990
- --- folder.c Fri Nov 16 18:12:03 1990
- ***************
- *** 178,183 ****
- --- 178,186 ----
- }
-
- if (c == '/')
- + #ifdef ALLOW_LEADING_DOUBLE_SLASH
- + if (dp != &dest[1])
- + #endif
- if (dp != dest && dp[-1] == '/') goto no_parse;
-
- copy:
- *** ./LAST/global.c Wed Nov 7 15:54:29 1990
- --- global.c Mon Dec 10 15:37:07 1990
- ***************
- *** 453,458 ****
- --- 453,467 ----
- }
-
-
- + char *substchr(str, c1, c2)
- + char *str, c1, c2;
- + {
- + char *p;
- +
- + if ((p = strchr(str, c1)) != NULL) *p = c2;
- + return p;
- + }
- +
- char *copy_str(str)
- char *str;
- {
- ***************
- *** 632,637 ****
- --- 641,654 ----
- if (may_keep_old == 2) return 3;
- unlink(new);
- return -4;
- + }
- +
- + save_old_file(name, suffix)
- + char *name, *suffix;
- + {
- + char buf[FILENAME];
- + sprintf(buf, "%s%s", name, suffix);
- + return move_file(name, buf, 0);
- }
-
- #ifdef HAVE_SYSLOG
- *** ./LAST/init.c Wed Nov 7 15:54:32 1990
- --- init.c Wed Nov 28 20:52:45 1990
- ***************
- *** 21,26 ****
- --- 21,28 ----
-
- export long initial_memory_break; /* for :debug statistics */
-
- + export int first_time_user = 0;
- +
- static int init_err = 0; /* errors in init file */
-
-
- ***************
- *** 230,238 ****
- */
-
- static char *sw_string;
-
- #define SWITCH(str) \
- ! for (sw_string = str; sw_string; sw_string = NULL)
-
- #define CASE(str) \
- if (strcmp(sw_string, str) == 0)
- --- 232,241 ----
- */
-
- static char *sw_string;
- + static int sw_loop_once;
-
- #define SWITCH(str) \
- ! for (sw_string = str, sw_loop_once = 1; --sw_loop_once == 0; )
-
- #define CASE(str) \
- if (strcmp(sw_string, str) == 0)
- ***************
- *** 909,914 ****
- --- 912,931 ----
-
- start_up_macro = parse_enter_macro(f, NL);
- return;
- + }
- +
- + CASE( "first-use" ) {
- + extern char *newsrc_file;
- +
- + if (!first_time_user) break;
- + if (argv(2) == NULL || ARG(2, "all")) return;
- + if (newsrc_file == NULL) /* == code from visit_rc_file == */
- + newsrc_file = home_relative(".newsrc");
- + if (ARG(2, "old") && file_exist(newsrc_file, (char *)NULL))
- + return;
- + if (ARG(2, "new") && !file_exist(newsrc_file, (char *)NULL))
- + return;
- + break;
- }
-
- goto on_err;
- *** ./LAST/kill.c Tue Sep 18 12:45:00 1990
- --- kill.c Mon Nov 26 15:48:27 1990
- ***************
- *** 12,17 ****
- --- 12,18 ----
- export int dflt_kill_select = 30;
- export int kill_file_loaded = 0;
- export int kill_debug = 0;
- + export int kill_ref_count = 0;
-
- char KILL_FILE[] = "kill";
- char COMPILED_KILL[] = "KILL.COMP";
- ***************
- *** 217,224 ****
- if (kl->kill_flag & AUTO_KILL)
- goto did_kill;
-
- ! if (kl->kill_flag & AUTO_SELECT)
- ah->attr = A_AUTO_SELECT;
- goto no_kill;
- }
-
- --- 218,227 ----
- if (kl->kill_flag & AUTO_KILL)
- goto did_kill;
-
- ! if (kl->kill_flag & AUTO_SELECT) {
- ah->attr = A_AUTO_SELECT;
- + goto did_select;
- + }
- goto no_kill;
- }
-
- ***************
- *** 225,230 ****
- --- 228,243 ----
- if (unless_match) goto did_kill;
-
- no_kill:
- + if (kill_ref_count && (ah->replies & 0x7f) >= kill_ref_count) {
- + if (kill_debug) {
- + pg_next();
- + printf("REFERENCE COUNT (%d) >= %d\n",
- + ah->replies & 0x7f, kill_ref_count);
- + }
- + goto did_kill;
- + }
- +
- + did_select:
- if (kill_debug && pg_end() < 0) kill_debug = 0;
- return 0;
-
- *** ./LAST/man/nn.1.B Wed Nov 7 15:54:38 1990
- --- man/nn.1.B Wed Feb 6 15:33:34 1991
- ***************
- *** 211,217 ****
- just \fBreturn\fP to take the default action):
- .br
- .sp 0.5v
- ! a)bort c)c e)dit i)spell m)ail r)eedit s)end v)iew w)rite
- .br
- Action: (post article)
- .sp 0.5v
- --- 211,217 ----
- just \fBreturn\fP to take the default action):
- .br
- .sp 0.5v
- ! a)bort c)c e)dit h)old i)spell m)ail r)eedit s)end v)iew w)rite
- .br
- Action: (post article)
- .sp 0.5v
- ***************
- *** 227,232 ****
- --- 227,234 ----
- .br
- \fBe\fP edit the file again,
- .br
- + \fBh\fP hold response for later completion,
- + .br
- \fBi\fP run an (interactive) \fBspell-checker\fP on the text,
- .br
- \fBm\fP mail a (blind) copy to a specified recipient,
- ***************
- *** 246,251 ****
- --- 248,260 ----
- \fBy\fP confirm \fIdefault answer\fP (e.g. \fIyes\fP post it)
- .in -2m
- .DT
- + .LP
- + To complete an unfinished response saved by the h)old command, simply
- + enter any response action, e.g. \fBR\fP {\fBreply\fP}. This will
- + notice the unfinished response and ask you whether you want to
- + complete it now. Only one unfinished response can exist at a time.
- + Notice that the $A environment variable may no longer be valid as a
- + path to the original article when the response is completed.
- .LP
- \fBRelated variables\fP:
- append-signature-mail, append-signature-post, default-distribution,
- *** ./LAST/man/nn.1.C Wed Nov 7 15:54:41 1990
- --- man/nn.1.C Wed Feb 6 15:33:34 1991
- ***************
- *** 681,686 ****
- --- 681,694 ----
- The key which deletes the current line
- when \fInn\fP is prompting for a string, e.g. a file name.
- .TP
- + \fBkill-reference-count\fP \fIN\fP (integer, default 0)
- + When this variable is non-zero, all articles which have \fIN\fP or
- + more references on the References: line (corresponding to the number
- + of >>'s on the menu line) will be auto-killed if they are not
- + auto-selected (or preserved) via an entry in the kill file. It should
- + probably not be used globally for all groups, but can be set on a
- + per-group via the entry macros.
- + .TP
- \fBlayout\fP \fInumber\fP (integer, default 1)
- Set the menu layout. The argument must be a number between 0 and 4.
- .TP
- ***************
- *** 815,820 ****
- --- 823,841 ----
- start-up if it has changed since it was last shown. The message is
- taken from the file "motd" in the lib directory. It can also be shown
- (again) using the \fB:motd\fP command.
- + .TP
- + \fBmulti-key-guard-time\fP \fItimeout\fP (integer, default 2)
- + When reading a multi-key sequence from the keyboard, \fInn\fP will
- + expect the characters constituting the multi-key to arrive "quickly"
- + after each other. When a partial multi-key sequence is read,
- + \fInn\fP will wait (at least) \fItimeout\fP tenths of a second for
- + each of the following characters to arrive to complete the multi-key
- + sequence. If the multi-key sequence is \fInot\fP completed within
- + this period, \fInn\fP will read the partial multi-key sequence as
- + individual characters instead. This way it is still possible to use
- + for example the ESC key on a terminal with vt100 like arrow keys.
- + When \fInn\fP is used via an rlogin connection, you may have to
- + increase the timeout to get reliable recognition of multi-keys.
- .TP
- \fBnew-group-action\fP \fIaction\fP (integer, default 3)
- This variable controls how new groups are treated by \fInn\fP. It is
- *** ./LAST/master.c Wed Nov 7 15:54:46 1990
- --- master.c Mon Dec 10 17:04:08 1990
- ***************
- *** 287,293 ****
- gh->group_num = master.number_of_groups++;
- gh->creation_time = cur_time();
-
- ! db_append_group(gh);
-
- group_restriction(gh); /* done after append to avoid setting ! */
- clean_group(gh);
- --- 287,293 ----
- gh->group_num = master.number_of_groups++;
- gh->creation_time = cur_time();
-
- ! db_rewrite_groups(1, (group_header *)NULL);
-
- group_restriction(gh); /* done after append to avoid setting ! */
- clean_group(gh);
- ***************
- *** 335,340 ****
- --- 335,341 ----
- char command[512];
- char groupname[512];
- group_header *groups, *next_g, *gh;
- + group_header *dupg;
- FILE *src;
- int lcount, use_group_file, found_nn_group = 0;
-
- ***************
- *** 440,445 ****
- --- 441,453 ----
- gh->archive_file = NULL;
- }
-
- + for (dupg = groups->next_group; dupg != NULL; dupg = dupg->next_group)
- + if (strcmp(dupg->group_name, gh->group_name) == 0) break;
- + if (dupg != NULL) {
- + printf("Ignored duplicate of group %s\n", dupg->group_name);
- + continue;
- + }
- +
- gh->group_num = master.number_of_groups++;
-
- if (trace || debug_mode)
- ***************
- *** 471,487 ****
-
- printf("%s %s/GROUPS file\n",
- use_group_file ? "Updating" : "Building", db_directory);
- - sprintf(command, "cd %s ; [ -f GROUPS ] && (rm -f GROUPS~ ; mv GROUPS GROUPS~)",
- - db_directory);
- - system(command);
-
- ! open_groups(OPEN_CREATE|MUST_EXIST);
- !
- ! for (gh = groups->next_group; gh != NULL; gh = gh->next_group)
- ! db_append_group(gh);
-
- - close_groups();
- -
- if (initialize > 0) {
- printf("Setting articles per group limit to %d...\n", initialize);
- db_write_master();
- --- 479,487 ----
-
- printf("%s %s/GROUPS file\n",
- use_group_file ? "Updating" : "Building", db_directory);
-
- ! db_rewrite_groups(use_group_file, groups);
-
- if (initialize > 0) {
- printf("Setting articles per group limit to %d...\n", initialize);
- db_write_master();
- ***************
- *** 547,552 ****
- --- 547,581 ----
- log_entry('M', "Reread GROUPS file");
- }
-
- + #ifdef HAVE_HARD_SLEEP
- + /*
- + * Hard sleeper... The normal sleep is not terminated by SIGALRM or
- + * other signals which nnadmin may send to wake it up.
- + */
- +
- + static int got_alarm;
- + static sig_type catch_alarm()
- + {
- + signal(SIGALRM, SIG_IGN);
- + got_alarm = 1;
- + }
- +
- + static take_a_nap(t)
- + int t;
- + {
- + got_alarm = 0;
- + signal(SIGALRM, catch_alarm);
- + alarm(repeat_delay);
- + /* the timeout is at least 1 minute, so we ignore racing condition here */
- + pause();
- + if (!got_alarm) {
- + signal(SIGALRM, SIG_IGN);
- + alarm(0);
- + }
- + }
- + #else
- + #define take_a_nap(t) sleep(t)
- + #endif
-
- main(argc, argv)
- int argc;
- ***************
- *** 557,562 ****
- --- 586,592 ----
- int group_selection;
- int temp;
- int skip_pass;
- + long pass_no;
-
- umask(002); /* avoid paranoia */
-
- ***************
- *** 623,628 ****
- --- 653,662 ----
- }
-
- if (proto_lock(I_AM_MASTER, PL_SET) != 0) {
- + extern char proto_host[];
- + if (proto_host[0])
- + printf("The master is running on another host (%s)\n", proto_host);
- + else
- printf("The master is already running\n");
- exit(0);
- }
- ***************
- *** 710,716 ****
- unconditional = 1;
- }
-
- ! for (;;) {
- #ifdef NNTP
- if (use_nntp && nntp_get_active() < 0) {
- nntp_close_server();
- --- 744,755 ----
- unconditional = 1;
- }
-
- ! for (pass_no = 0; !s_hangup; pass_no++) {
- ! if (pass_no > 0) {
- ! take_a_nap(repeat_delay);
- ! if (s_hangup) break;
- ! }
- !
- #ifdef NNTP
- if (use_nntp && nntp_get_active() < 0) {
- nntp_close_server();
- ***************
- *** 719,725 ****
- repeat_delay ? "sleeping" : "terminating");
- if (repeat_delay == 0)
- nn_exit(1);
- - sleep(repeat_delay);
- continue;
- }
- #endif
- --- 758,763 ----
- ***************
- *** 753,760 ****
- }
-
- if (trace) log_entry('T', "none");
- - sleep(repeat_delay);
- - if (s_hangup) break;
- continue;
- }
-
- --- 791,796 ----
- ***************
- *** 772,779 ****
- #ifdef NNTP
- if (use_nntp) nntp_cleanup();
- #endif
- - sleep(repeat_delay);
- - if (s_hangup) break;
- }
-
- nn_exit(0);
- --- 808,813 ----
- ***************
- *** 794,801 ****
- int32 arg;
- int must_collect;
- register group_header *gh;
-
- ! gate = open_file(relative(master_directory, "GATE"), OPEN_READ | OPEN_UNLINK);
- if (gate == NULL) return 0;
-
- sleep(2); /* give administrator time to flush buffers */
- --- 828,836 ----
- int32 arg;
- int must_collect;
- register group_header *gh;
- + FILE *open_gate_file();
-
- ! gate = open_gate_file(OPEN_READ);
- if (gate == NULL) return 0;
-
- sleep(2); /* give administrator time to flush buffers */
- *** ./LAST/nn.c Wed Nov 7 15:54:53 1990
- --- nn.c Wed Jan 30 18:32:14 1991
- ***************
- *** 46,51 ****
- --- 46,53 ----
- verbose = 0,
- Debug = 0;
-
- + export int check_db_update = 12 /* HOURS */;
- +
- static int
- nngrab_mode = 0,
- prompt_for_group = 0;
- ***************
- *** 121,128 ****
- return 0; /* will not update .newsrc */
- }
-
- ! if (proto_lock(I_AM_NN, PL_SET))
- user_error("\nAnother nn process is already running\n\n");
-
- must_unlock = 1;
- return 0;
- --- 123,136 ----
- return 0; /* will not update .newsrc */
- }
-
- ! if (proto_lock(I_AM_NN, PL_SET)) {
- ! extern char proto_host[];
- !
- ! if (proto_host[0])
- ! user_error("\nnn is running on host %s\nor .nn/LOCK should be removed.\n\n", proto_host);
- ! else
- user_error("\nAnother nn process is already running\n\n");
- + }
-
- must_unlock = 1;
- return 0;
- ***************
- *** 223,228 ****
- --- 231,237 ----
-
- if (access_mode == 0 && !also_read_articles) {
- gh = last_group_maint(gh, 0);
- + did_jump = gh != group_sequence;
- m_invoke(-2);
- }
-
- ***************
- *** 638,643 ****
- --- 647,667 ----
- return 1;
- }
-
- + static do_db_check()
- + {
- + import char *news_active;
- + time_t last_upd;
- +
- + last_upd = (cur_time() - master.last_scan) / (60 * 60);
- + if (last_upd < check_db_update) return;
- + /* too old - but is nnmaster the culprit? */
- + if (master.last_scan == file_exist(news_active, (char *)NULL))
- + printf("Notice: no news has arrived for the last %ld hours\n", last_upd);
- + else
- + printf("Notice: nnmaster has not updated database in %ld hours\n", last_upd);
- + sleep(3);
- + }
- +
- clean_group(gh)
- group_header *gh;
- {
- ***************
- *** 768,773 ****
- --- 792,800 ----
- init_term(1);
-
- if (say_welcome) {
- + extern int first_time_user;
- +
- + first_time_user = 1;
- display_file("adm.welcome", CLEAR_DISPLAY | CONFIRMATION);
- clrdisp();
- }
- ***************
- *** 929,934 ****
- --- 956,964 ----
- break;
-
- case I_AM_NN:
- + if (check_db_update)
- + do_db_check();
- +
- if (unread_articles == 0 &&
- group_name_args == 0 &&
- !also_read_articles &&
- *** ./LAST/pack_date.c Mon Apr 23 18:25:59 1990
- --- pack_date.c Tue Feb 5 17:50:18 1991
- ***************
- *** 17,22 ****
- --- 17,200 ----
-
- /* #define DATE_TEST /* never define this !! */
-
- + #ifndef USE_OLD_TZ_CODE
- +
- + #undef W
- + #undef E
- + #undef DST
- + #undef UTC
- + #define W * (-60) -
- + #define E * 60 +
- + #define DST + 60
- + #define UTC 60 *
- +
- + static struct zonetab {
- + char *tz_name;
- + int32 tz_offset;
- + } ztab[] = {
- + "a", UTC 1, /* UTC+1h */
- + "acsst", 9 E 30 DST, /* Cent. Australia */
- + "acst", 9 E 30, /* Cent. Australia */
- + "adt", 4 W 0 DST, /* Atlantic (Canada) */
- + "aesst", 10 E 0 DST, /* E. Australia */
- + "aest", 10 E 0, /* E. Australia */
- + "ast", 4 W 0, /* Atlantic (Canada) */
- + "awsst", 8 E 0 DST, /* W. Australia */
- + "awst", 8 E 0, /* W. Australia */
- + "b", UTC 2, /* UTC+2h */
- + "bst", 0 E 0 DST, /* Great Britain summertime */
- + "c", UTC 3, /* UTC+3h */
- + "cdt", 6 W 0 DST, /* Central */
- + "cest", 1 E 0 DST, /* Central Europe */
- + "cet", 1 E 0, /* Central Europe */
- + "cetdst", 1 E 0 DST, /* Central Europe */
- + "cst", 6 W 0, /* Central */
- + "d", UTC 4, /* UTC+4h */
- + "dnt", 1 E 0, /* Denmark */
- + "dst", 1 E 0 DST, /* Denmark */
- + "e", UTC 5, /* UTC+5h */
- + "edt", 5 W 0 DST, /* Eastern US */
- + "eest", 2 E 0 DST, /* Eastern Europe */
- + "eet", 2 E 0, /* Eastern Europe */
- + "eetdst", 2 E 0 DST, /* Eastern Europe */
- + "est", 5 W 0, /* Eastern US */
- + "f", UTC 6, /* UTC+6h */
- + "g", UTC 7, /* UTC+7h */
- + "gmt", 0, /* */
- + "h", UTC 8, /* UTC+8h */
- + "hdt", 10 W 0 DST, /* Hawaii/Alaska */
- + "hst", 10 W 0, /* Hawaii/Alaska */
- + "i", UTC 9, /* UTC+9h */
- + "ist", 2 E 0, /* Israel */
- + "jst", 9 E 0, /* Japan */
- + "k", UTC 10, /* UTC+10h */
- + "l", UTC 11, /* UTC+11h */
- + "m", UTC 12, /* UTC+12h */
- + "mdt", 7 W 0 DST, /* Mountain US */
- + "mest", 1 E 0 DST, /* Central Europe */
- + "met", 1 E 0, /* Central Europe */
- + "metdst", 1 E 0 DST, /* Central Europe */
- + "mst", 7 W 0, /* Mountain */
- + "n", UTC -1, /* UTC-1h */
- + "ndt", 3 W 30 DST, /* Nfld. (Canada) */
- + "nst", 3 W 30, /* Nfld. (Canada) */
- + "o", UTC -2, /* UTC-2h */
- + "p", UTC -3, /* UTC-3h */
- + "pdt", 8 W 0 DST, /* Pacific */
- + "pst", 8 W 0, /* Pacific */
- + "q", UTC -4, /* UTC-4h */
- + "r", UTC -5, /* UTC-5h */
- + "s", UTC -6, /* UTC-6h */
- + "t", UTC -7, /* UTC-7h */
- + "u", UTC -8, /* UTC-8h */
- + "ut", UTC 0, /* UTC */
- + "utc", UTC 0, /* UTC */
- + "v", UTC -9, /* UTC-9h */
- + "w", UTC -10, /* UTC-10h */
- + "west", 0 E 0 DST, /* Western Europe */
- + "wet", 0 E 0, /* Western Europe */
- + "wetdst", 0 E 0 DST, /* Western Europe */
- + "x", UTC -11, /* UTC-11h */
- + "y", UTC -12, /* UTC-12h */
- + "ydt", 9 W 0 DST, /* Yukon */
- + "yst", 9 W 0, /* Yukon */
- + "z", UTC 0, /* UTC */
- + NULL, 0
- + };
- +
- + #undef MAXZ
- + #define MAXZ 10
- +
- + static long tzone(date)
- + register char *date;
- + {
- + register int i, n;
- + static char zone[MAXZ], num[MAXZ];
- + register struct zonetab *z;
- + long adjust, sign;
- + static int first = 1;
- +
- + i = 0;
- + while (*date && isascii(*date) && isspace(*date)) date++;
- +
- + for ( ; *date && isascii(*date) ; date++) {
- + if (*date == '+' || *date == '-' || isdigit(*date))
- + goto numeric_zone;
- + if (isspace(*date)) break;
- + if (!isalpha(*date)) continue; /* p.s.t. -> pst */
- + if (i == MAXZ) continue;
- + zone[i++] = isupper(*date) ? tolower(*date) : *date;
- + }
- +
- + while (*date && isascii(*date) && isspace(*date)) date++;
- + if (*date && i < MAXZ-3) {
- + if (date[0] != 'D' && date[0] != 'd') goto no_dst;
- + if (date[1] != 'S' && date[1] != 's') goto no_dst;
- + if (date[2] != 'T' && date[2] != 't') goto no_dst;
- + zone[i++] = 'd';
- + zone[i++] = 's';
- + zone[i++] = 't';
- + }
- +
- + no_dst:
- + if (i == 0) return 0;
- + adjust = 0;
- + if (*date != '+' && *date != '-') goto non_numeric;
- +
- + numeric_zone: /* {+-}[H]H[MM] */
- + switch (*date) {
- + case '-':
- + date++;
- + sign = -1;
- + break;
- + case '+':
- + date++;
- + default:
- + sign = 1;
- + break;
- + }
- +
- + adjust = 0;
- + for (n = 0; n < MAXZ && *date && isascii(*date) && isdigit(*date); )
- + num[n++] = *date++;
- + num[n] = NUL;
- +
- + switch (n) {
- + case 0:
- + break;
- + case 3: /* +HMM */
- + adjust = atoi(num+1);
- + case 1: /* +H */
- + adjust += (num[0] - '0') * 60;
- + break;
- + case 2: /* +HH */
- + adjust = atoi(num) * 60;
- + break;
- + default: /* +HHMM */
- + if (num[2] != '0' || num[3] != '0') {
- + num[4] = NUL;
- + adjust = atoi(num + 2);
- + }
- + num[2] = NUL;
- + adjust += atoi(num) * 60;
- + break;
- + }
- + adjust *= sign;
- + if (i == 0) return adjust;
- +
- + non_numeric:
- + zone[i] = NUL;
- +
- + for (z = ztab; z->tz_name != NULL; z++) {
- + if ((i = strcmp(zone, z->tz_name)) > 0) continue;
- + if (i < 0) break;
- + return z->tz_offset + adjust;
- + }
- + return adjust;
- + }
- +
- + #else
- +
- static long wtz(h, m, c)
- int h, m;
- char c;
- ***************
- *** 98,103 ****
- --- 276,283 ----
- return tz;
- }
-
- + #endif
- +
- static next_int(dp)
- char **dp;
- {
- ***************
- *** 124,149 ****
-
- while (*date && isspace(*date)) date++;
-
- ! switch (*date++) {
- ! case 'J':
- ! if (*date++ == 'a') { mon = 0; break; }
- ! if (*date++ == 'n') { mon = 5; break; }
- mon = 6; break;
- ! case 'F':
- mon = 1; break;
- ! case 'M':
- ! if (*++date == 'r') { mon = 2; break; }
- mon = 4; break;
- ! case 'A':
- ! if (*date++ == 'p') { mon = 3; break; }
- mon = 7; break;
- ! case 'S':
- mon = 8; break;
- ! case 'O':
- mon = 9; break;
- ! case 'N':
- mon = 10; break;
- ! case 'D':
- mon = 11; break;
- default:
- return 0;
- --- 304,330 ----
-
- while (*date && isspace(*date)) date++;
-
- ! if (date[0] == NUL || date[1] == NUL || date[2] == NUL) return 0;
- ! switch (date[0]) {
- ! case 'J': case 'j':
- ! if (date[1] == 'a' || date[1] == 'A') { mon = 0; break; }
- ! if (date[2] == 'n' || date[2] == 'N') { mon = 5; break; }
- mon = 6; break;
- ! case 'F': case 'f':
- mon = 1; break;
- ! case 'M': case 'm':
- ! if (date[2] == 'r' || date[2] == 'R') { mon = 2; break; }
- mon = 4; break;
- ! case 'A': case 'a':
- ! if (date[1] == 'p' || date[1] == 'P') { mon = 3; break; }
- mon = 7; break;
- ! case 'S': case 's':
- mon = 8; break;
- ! case 'O': case 'o':
- mon = 9; break;
- ! case 'N': case 'n':
- mon = 10; break;
- ! case 'D': case 'd':
- mon = 11; break;
- default:
- return 0;
- ***************
- *** 152,158 ****
- --- 333,341 ----
- year = next_int(&date);
- hour = next_int(&date);
- min = next_int(&date);
- + if (*date == ':') next_int(&date);
-
- + if (year >= 100) year -= 1900; /* xxYY -> YY */
- year -= 87; /* base is 1987 */
- if (year < 0) year += 100;
-
- *** ./LAST/patchlevel.h Wed Nov 7 15:54:55 1990
- --- patchlevel.h Tue Feb 5 15:20:42 1991
- ***************
- *** 23,29 ****
- * 1990-09-18: Patch #10 (6.4.10) - HIGH
- * 1990-10-05: Patch #11 (6.4.11) - HIGH
- * 1990-11-07: Patch #12 (6.4.12) - LOW
- */
-
- ! #define PATCHLEVEL 12
-
- --- 23,30 ----
- * 1990-09-18: Patch #10 (6.4.10) - HIGH
- * 1990-10-05: Patch #11 (6.4.11) - HIGH
- * 1990-11-07: Patch #12 (6.4.12) - LOW
- + * 1991-02-06: Patch #13 (6.4.13) - MEDIUM
- */
-
- ! #define PATCHLEVEL 13
-
- *** ./LAST/proto.c Mon Jul 9 18:00:05 1990
- --- proto.c Mon Dec 10 16:26:32 1990
- ***************
- *** 18,23 ****
- --- 18,26 ----
-
- import char *master_directory, *db_directory;
-
- + #define HOSTBUF 80
- + export char proto_host[HOSTBUF]; /* host having the lock */
- +
- /*
- * When setting a lock, we must check a little later that
- * we really got the lock set, i.e. that another process
- ***************
- *** 38,43 ****
- --- 41,88 ----
- * pid Locked and running (PL_CHECK)
- */
-
- + static write_lock(lock, operation)
- + char *lock, *operation;
- + {
- + FILE *m_pid;
- + char host[HOSTBUF];
- +
- + m_pid = open_file(lock, OPEN_CREATE);
- + if (m_pid == NULL)
- + sys_error("Cannot %s lock file: %s", operation, lock);
- + gethostname(host, HOSTBUF);
- + fprintf(m_pid, "%d\n%s\n", process_id, host);
- + fclose(m_pid);
- + }
- +
- + static int read_lock(lock)
- + char *lock;
- + {
- + FILE *m_pid;
- + char host[HOSTBUF];
- + char pid[10];
- +
- + pid[0] = NUL;
- + proto_host[0] = NUL;
- +
- + m_pid = open_file(lock, OPEN_READ);
- + if (m_pid == NULL) return -2; /* no lock */
- + fgets(pid, 10, m_pid);
- + fgets(proto_host, HOSTBUF, m_pid);
- + fclose(m_pid);
- +
- + if (pid[0] == NUL) return 0; /* corrupted lock */
- +
- + if (proto_host[0] != NUL) {
- + substchr(proto_host, NL, NUL);
- + gethostname(host, HOSTBUF);
- + if (strncmp(proto_host, host, HOSTBUF) != 0)
- + return -1; /* locked by another host */
- + proto_host[0] = NUL;
- + }
- + return atoi(pid);
- + }
- +
- proto_lock(prog, command)
- {
- FILE *m_pid;
- ***************
- *** 65,73 ****
- }
-
- if (command == PL_TRANSFER) {
- ! m_pid = open_file(lock, OPEN_UPDATE|MUST_EXIST);
- ! fprintf(m_pid, "%d\n", process_id);
- ! fclose(m_pid);
- return 1;
- }
-
- --- 110,116 ----
- }
-
- if (command == PL_TRANSFER) {
- ! write_lock(lock, "transfer");
- return 1;
- }
-
- ***************
- *** 77,94 ****
- try = 1;
- again:
-
- ! m_pid = open_file(lock, OPEN_READ);
- ! if (m_pid == NULL) goto no_lock;
- ! any = fgets(buf, 10, m_pid);
- ! fclose(m_pid);
- !
- ! if (any == NULL || (pid = atoi(buf)) <= 2) {
- ! /* lock file is corrupted! */
- if (who_am_i == I_AM_NN) goto rm_lock;
- if (--try < 0) goto rm_lock;
- sleep(LOCK_SAFETY); /* maybe it is being written */
- goto again;
- ! }
-
- if (kill(pid, command == PL_TERMINATE ? SIGHUP : SIGALRM) == 0) {
- switch (command) {
- --- 120,140 ----
- try = 1;
- again:
-
- ! switch (pid = read_lock(lock)) {
- ! case -2:
- ! goto no_lock;
- ! case -1: /* wrong host */
- ! return 1;
- ! case 0:
- ! case 1:
- ! case 2: /* corrupted lock file */
- if (who_am_i == I_AM_NN) goto rm_lock;
- if (--try < 0) goto rm_lock;
- sleep(LOCK_SAFETY); /* maybe it is being written */
- goto again;
- ! default:
- ! break;
- ! }
-
- if (kill(pid, command == PL_TERMINATE ? SIGHUP : SIGALRM) == 0) {
- switch (command) {
- ***************
- *** 124,134 ****
- if (command != PL_SET && command != PL_SET_QUICK && command != PL_SET_WAIT)
- return -1;
-
- ! m_pid = open_file(lock, OPEN_CREATE);
- ! if (m_pid == NULL)
- ! sys_error("Cannot create lock file: %s", lock);
- ! fprintf(m_pid, "%d\n", process_id);
- ! fclose(m_pid);
-
- /* a user will not start nn twice at the exact same time! */
- if (who_am_i == I_AM_NN || command == PL_SET_QUICK) return 0;
- --- 170,176 ----
- if (command != PL_SET && command != PL_SET_QUICK && command != PL_SET_WAIT)
- return -1;
-
- ! write_lock(lock, "create");
-
- /* a user will not start nn twice at the exact same time! */
- if (who_am_i == I_AM_NN || command == PL_SET_QUICK) return 0;
- ***************
- *** 135,148 ****
-
- sleep(LOCK_SAFETY);
-
- ! m_pid = open_file(lock, OPEN_READ);
- ! if (m_pid == NULL) return 1; /* somebody stole the lock file */
- ! any = fgets(buf, 10, m_pid);
- ! fclose(m_pid);
-
- ! if (any == NULL || atoi(buf) != process_id) return 1;
-
- ! return 0; /* lock is set */
- }
-
- send_master(command, gh, opt, arg)
- --- 177,219 ----
-
- sleep(LOCK_SAFETY);
-
- ! if (read_lock(lock) != process_id)
- ! return 1; /* somebody stole the lock file */
- ! return 0; /* lock is set */
- ! }
- !
- ! FILE *open_gate_file(mode)
- ! int mode;
- ! {
- ! char *gate, *err;
- ! FILE *gf;
-
- ! gate = relative(master_directory, "GATE");
- ! gf = open_file(gate, mode);
- ! err = NULL;
- !
- ! switch (mode) {
- ! case OPEN_READ:
- ! if (gf != NULL) {
- ! if (unlink(gate) == 0) break;
- ! err = "unlink";
- ! break;
- ! }
- ! if (errno != ENOENT) err = "read";
- ! break;
- !
- ! default:
- ! if (gf != NULL) chmod(gate, 0644); /* override restrictive umask */
- ! /* caller must complain if cannot open! */
- ! break;
- ! }
-
- ! if (err != NULL) {
- ! sys_warning("Cannot %s %s (err=%d). Check modes!!", err, gate, errno);
- ! if (gf != NULL) fclose(gf);
- ! return NULL;
- ! }
- ! return gf;
- }
-
- send_master(command, gh, opt, arg)
- ***************
- *** 153,159 ****
- {
- FILE *gate;
-
- ! gate = open_file(relative(master_directory, "GATE"), OPEN_APPEND);
-
- if (gate == NULL) {
- printf("Cannot send to master (check GATE file)\n");
- --- 224,230 ----
- {
- FILE *gate;
-
- ! gate = open_gate_file(OPEN_APPEND);
-
- if (gate == NULL) {
- printf("Cannot send to master (check GATE file)\n");
- *** ./LAST/term.c Fri Oct 5 19:07:20 1990
- --- term.c Wed Nov 28 21:07:00 1990
- ***************
- *** 41,46 ****
- --- 41,47 ----
- export int flow_control = 1;
- export int use_visible_bell = 1; /* if supported by terminal */
- export int ignore_xon_xoff = 1;
- + export int multi_key_guard_time = 2; /* tenths of a second */
-
- export key_type help_key = '?';
- export key_type comp1_key = SP;
- ***************
- *** 101,108 ****
- int cookie_size; /* size of magic cookie */
- int two_cookies; /* space needed to enter&exit standout mode */
- int STANDOUT; /* terminal got standout mode */
- - int WRAP; /* terminal got automatic margins */
-
- #ifdef HAVE_TERMIO
-
- #define KEY_BURST 50 /* read bursts of 50 chars (or timeout after 100 ms) */
- --- 102,116 ----
- int cookie_size; /* size of magic cookie */
- int two_cookies; /* space needed to enter&exit standout mode */
- int STANDOUT; /* terminal got standout mode */
-
- + #ifdef FAKE_INTERRUPT
- + #include <setjmp.h>
- +
- + extern jmp_buf fake_keyb_sig;
- + extern int arm_fake_keyb_sig;
- + extern char fake_keyb_siglist[];
- + #endif
- +
- #ifdef HAVE_TERMIO
-
- #define KEY_BURST 50 /* read bursts of 50 chars (or timeout after 100 ms) */
- ***************
- *** 122,135 ****
-
- #else /* V7/BSD TTY DRIVER */
-
- - #ifdef FAKE_INTERRUPT
- - #include <setjmp.h>
- -
- - extern jmp_buf fake_keyb_sig;
- - extern int arm_fake_keyb_sig;
- - extern char fake_keyb_siglist[];
- - #endif
- -
- #include <sgtty.h>
-
- static struct sgttyb norm_tty, raw_tty;
- --- 130,135 ----
- ***************
- *** 169,174 ****
- --- 169,193 ----
-
- #endif /* USE_TERMCAP */
-
- + /*
- + * timeout in n/10 seconds via SIGALRM
- + */
- +
- + micro_alarm(n)
- + int n;
- + {
- + #ifdef HAVE_UALARM
- + ualarm(n<=1 ? 100000 : n*100000, 0); /* 4.3 BSD ualarm() */
- + #else
- + #ifdef MICRO_ALARM
- + if (n <= 0) n = 1;
- + MICRO_ALARM(n); /* System specific timeout */
- + #else
- + alarm(n <= 10 ? 1 : (n+9)/10); /* Standard alarm() call */
- + #endif
- + #endif
- + }
- +
- static int multi_keys = 0;
-
- static struct multi_key {
- ***************
- *** 350,356 ****
- Columns = columns;
- Lines = lines;
- cookie_size = magic_cookie_glitch;
- - WRAP = auto_right_margin;
- if (use_visible_bell && HAS_CAP(flash_screen))
- strcpy(bell_str, flash_screen);
- else if (HAS_CAP(bell))
- --- 369,374 ----
- ***************
- *** 391,397 ****
-
- cookie_size = tgetnum("sg");
-
- - WRAP = tgetflag("am");
- ceol_standout_glitch = tgetflag("xs");
-
- opt_cap("ti", enter_ca_mode);
- --- 409,414 ----
- ***************
- *** 451,457 ****
- ospeed = norm_tty.sg_ospeed;
- set_term_speed((unsigned long)ospeed);
-
- ! raw_tty.sg_flags &= ~ECHO;
- #ifdef CBREAK
- #ifdef SV_INTERRUPT /* make read from tty interruptable */
- siginterrupt(SIGTSTP, 1); /* this is necessary to redraw screen */
- --- 468,474 ----
- ospeed = norm_tty.sg_ospeed;
- set_term_speed((unsigned long)ospeed);
-
- ! raw_tty.sg_flags &= ~(ECHO | CRMOD);
- #ifdef CBREAK
- #ifdef SV_INTERRUPT /* make read from tty interruptable */
- siginterrupt(SIGTSTP, 1); /* this is necessary to redraw screen */
- ***************
- *** 697,704 ****
- static int is_raw = 0;
-
- #ifdef HAVE_TERMIO
- ! #define RAW_MODE_ON ioctl(0, TCSETAF, &raw_tty)
- ! #define RAW_MODE_OFF ioctl(0, TCSETAF, &norm_tty)
- #else
- #define RAW_MODE_ON ioctl(0, TIOCSETP, &raw_tty)
- #define RAW_MODE_OFF ioctl(0, TIOCSETP, &norm_tty)
- --- 714,721 ----
- static int is_raw = 0;
-
- #ifdef HAVE_TERMIO
- ! #define RAW_MODE_ON ioctl(0, TCSETAW, &raw_tty)
- ! #define RAW_MODE_OFF ioctl(0, TCSETAW, &norm_tty)
- #else
- #define RAW_MODE_ON ioctl(0, TIOCSETP, &raw_tty)
- #define RAW_MODE_OFF ioctl(0, TIOCSETP, &norm_tty)
- ***************
- *** 814,819 ****
- --- 831,1042 ----
-
- #endif /* CBREAK */
-
- + #ifndef USE_OLD_GET_C_CODE
- +
- + #ifndef KEY_BURST
- + #define KEY_BURST 32
- + #endif
- + #define RD_PUSHBACK 10
- + static char rd_buffer[KEY_BURST+RD_PUSHBACK]; /* Holds stuff from read */
- + static char *rd_ptr;
- + static int rd_count = 0, rd_alarm = 0;
- + #ifdef FAKE_INTERRUPT
- + static jmp_buf fake_alarm_sig;
- + #endif
- +
- + static rd_timeout()
- + {
- + rd_alarm = 1;
- + #ifdef FAKE_INTERRUPT
- + longjmp(fake_alarm_sig, 1);
- + #endif
- + }
- +
- + #define RD_TIMEOUT 0x1000
- + #define RD_INTERRUPT 0x1001
- +
- + static int read_char_kbd(tmo)
- + int tmo; /* timeout if no input arrives */
- + {
- + if (rd_count <= 0) {
- + if (tmo) {
- + #ifdef FAKE_INTERRUPT
- + if (setjmp(fake_alarm_sig)) goto tmout;
- + #endif
- + rd_alarm = 0;
- + signal(SIGALRM, rd_timeout);
- + micro_alarm(multi_key_guard_time);
- + }
- + rd_ptr = rd_buffer + RD_PUSHBACK;
- + rd_count = read(0, rd_ptr, KEY_BURST);
- + if (tmo) {
- + if (rd_alarm) goto tmout;
- + alarm(0);
- + }
- + if (rd_count < 0) {
- + if (errno != EINTR) s_hangup++;
- + return RD_INTERRUPT;
- + }
- + }
- + --rd_count;
- + return *rd_ptr++;
- +
- + tmout:
- + rd_count = 0;
- + return RD_TIMEOUT;
- + }
- +
- + static unread_char(c)
- + char c;
- + {
- + if (rd_ptr == rd_buffer) return;
- + rd_count++;
- + *--rd_ptr = c;
- + }
- +
- + flush_input()
- + {
- + int arg;
- +
- + BATCH_CHECK;
- +
- + #ifdef HAVE_TERMIO
- + ioctl(0, TCFLSH, 0);
- + #else
- + #ifdef FREAD
- + arg = FREAD;
- + ioctl(0, TIOCFLUSH, &arg);
- + #else
- + ioctl(0, TIOCFLUSH, 0);
- + #endif
- + #endif
- + rd_count = 0;
- + }
- +
- + int enable_stop = 1;
- +
- + static int do_macro_processing = 1;
- +
- + get_c()
- + {
- + key_type c, first_key;
- + int key_cnt, mc, n;
- + register struct multi_key *mk, *multi_match;
- + register int i;
- +
- + next_key:
- + if (s_hangup) return K_interrupt;
- +
- + if (do_macro_processing)
- + switch (m_getc(&mc)) {
- + case 0: break;
- + case 1: return mc;
- + case 2: return K_interrupt;
- + }
- +
- + #ifdef RESIZING
- + if (s_resized) goto redraw;
- + #endif
- +
- + if (batch_mode)
- + user_error("Attempt to read keyboard input in batch mode");
- +
- + for (i = multi_keys, mk = multi_key_list; --i >= 0; mk++)
- + mk->cur_key = mk->keys;
- + key_cnt = 0;
- +
- + #ifdef FAKE_INTERRUPT
- + if (setjmp(fake_keyb_sig)) goto intr;
- + arm_fake_keyb_sig = 1;
- + #endif
- +
- + multi:
- + switch (n = read_char_kbd(key_cnt)) {
- +
- + case RD_INTERRUPT:
- + #ifdef CBREAK
- + if (s_redraw) goto redraw;
- + #endif
- + #ifdef RESIZING
- + if (s_resized) goto redraw;
- + #endif
- + goto intr;
- +
- + case RD_TIMEOUT:
- + while (--key_cnt > 0) unread_char(multi_match->keys[key_cnt]);
- + c = first_key;
- + goto got_char;
- +
- + default:
- + c = (key_type)n;
- + if (data_bits < 8) c &= 0x7f;
- + if (ignore_xon_xoff)
- + if (c == CONTROL_('Q') || c == CONTROL_('S')) goto multi;
- + break;
- + }
- +
- + multi_match = NULL;
- + for (i = multi_keys, mk = multi_key_list; --i >= 0; mk++) {
- + if (mk->cur_key == NUL) continue;
- + if (*(mk->cur_key)++ != c) {
- + mk->cur_key = NUL;
- + continue;
- + }
- + if (*(mk->cur_key) == NUL) {
- + c = mk->code;
- + goto got_char;
- + }
- + multi_match = mk;
- + }
- +
- + if (multi_match) {
- + if (key_cnt == 0) first_key = c;
- + key_cnt++;
- + goto multi;
- + }
- + if (key_cnt) {
- + if (key_cnt == 1 && first_key == 033) {
- + unread_char(c);
- + c = 033;
- + goto got_char;
- + }
- + ding();
- + flush_input();
- + goto next_key;
- + }
- +
- + got_char:
- + #ifdef FAKE_INTERRUPT
- + arm_fake_keyb_sig = 0;
- + #endif
- + c = global_key_map[c];
- +
- + #ifndef CBREAK
- + if (c == IntrC) return K_interrupt; /* don't flush */
- + if (c == SuspC) {
- + if (enable_stop && suspend_nn()) goto redraw;
- + goto next_key;
- + }
- + #endif
- + return (int)c;
- +
- + intr:
- + #ifdef FAKE_INTERRUPT
- + arm_fake_keyb_sig = 0;
- + #endif
- + rd_count = 0;
- + return K_interrupt;
- +
- + redraw:
- + #ifdef RESIZING
- + s_resized = 0;
- + #endif
- + s_redraw = 0;
- + return GETC_COMMAND | K_REDRAW;
- + }
- +
- + #else /* original code */
- +
- static int do_flush_input = 0;
-
- flush_input()
- ***************
- *** 947,957 ****
- first_key = c;
- alarm_on = 1;
- signal(SIGALRM, mk_timeout);
- ! #ifdef MICRO_ALARM
- ! MICRO_ALARM();
- ! #else
- ! sleep(1);
- ! #endif
- }
- #endif
- key_cnt++;
- --- 1170,1176 ----
- first_key = c;
- alarm_on = 1;
- signal(SIGALRM, mk_timeout);
- ! micro_alarm(1);
- }
- #endif
- key_cnt++;
- ***************
- *** 1022,1027 ****
- --- 1241,1247 ----
- return (int)c;
- }
-
- + #endif
-
- /*
- * read string with completion, pre-filling, and break on first char
- *** ./LAST/term.h Mon Apr 23 18:25:52 1990
- --- term.h Wed Nov 28 21:06:59 1990
- ***************
- *** 18,24 ****
-
- extern int Lines, Columns;
- extern int cookie_size;
- ! extern int WRAP, STANDOUT;
-
- extern char *get_s();
-
- --- 18,24 ----
-
- extern int Lines, Columns;
- extern int cookie_size;
- ! extern int STANDOUT;
-
- extern char *get_s();
-
- *** ./LAST/variable.c Wed Nov 7 15:54:56 1990
- --- variable.c Wed Nov 28 15:03:11 1990
- ***************
- *** 186,191 ****
- --- 186,192 ----
- also_read_articles,
- article_limit,
- auto_read_limit,
- + check_db_update,
- conf_entry_limit,
- collapse_subject,
- Columns,
- ***************
- *** 197,202 ****
- --- 198,204 ----
- first_page_lines,
- fmt_linenum,
- kill_debug,
- + kill_ref_count,
- Lines,
- match_skip_prefix,
- mark_next_group,
- ***************
- *** 204,209 ****
- --- 206,212 ----
- mark_read_skip,
- message_history,
- min_pv_window,
- + multi_key_guard_time,
- new_group_action,
- newsrc_update_freq,
- orig_to_include_mask,
- ***************
- *** 294,299 ****
- --- 297,303 ----
- "backup-suffix", STR 0, (char **)&bak_suffix,
- "bug-report-address", STR 0, (char **)&bug_address,
- "case-fold-search", BOOL 0, (char **)&case_fold_search,
- + "check-db-update-time", INT 0, (char **)&check_db_update,
- "check-group-access", BOOL 0, (char **)&check_group_access,
- "collapse-subject", INT 3, (char **)&collapse_subject,
- "columns", INT 1, (char **)&Columns,
- ***************
- *** 353,358 ****
- --- 357,363 ----
- "kill", BOOL 0, (char **)&do_kill_handling,
- "kill-debug", BOOL 0, (char **)&kill_debug,
- "kill-key", KEY 0, (char **)&kill_key,
- + "kill-reference-count", INT 0, (char **)&kill_ref_count,
- "layout", INT 1, (char **)&fmt_linenum,
- "limit", INT 2, (char **)&article_limit,
- "lines", INT 1, (char **)&Lines,
- ***************
- *** 375,380 ****
- --- 380,386 ----
- "mmdf-format", BOOL 0, (char **)&use_mmdf_folders,
- "monitor", BOOL 0, (char **)&monitor_mode,
- "motd", BOOL 0, (char **)&show_motd_on_entry,
- + "multi-key-guard-time", INT 0, (char **)&multi_key_guard_time,
- "new-group-action", INT 0, (char **)&new_group_action,
- "new-style-read-prompt", BOOL 0, (char **)&new_read_prompt,
- "news-header", STR 0, (char **)&extra_news_headers,
- *** ./LAST/xmakefile Wed Nov 7 15:54:57 1990
- --- xmakefile Mon Dec 10 15:44:26 1990
- ***************
- *** 72,78 ****
-
- SHELL = /bin/sh
-
- ! MASTER = master.o collect.o expire.o proto.o \
- global.o options.o active.o db.o nntp.o \
- pack_date.o pack_name.o pack_subject.o news.o digest.o
-
- --- 72,78 ----
-
- SHELL = /bin/sh
-
- ! MASTER = master.o collect.o expire.o proto.o hostname.o \
- global.o options.o active.o db.o nntp.o \
- pack_date.o pack_name.o pack_subject.o news.o digest.o
-
- ***************
- *** 83,89 ****
- answer.o reroute.o hostname.o save.o unshar.o decode.o execute.o \
- pack_date.o pack_name.o pack_subject.o news.o digest.o match.o
-
- ! ACCT = account.o global.o options.o proto.o
-
- MAIL = nnmail.o reroute.o hostname.o global.o options.o
-
- --- 83,89 ----
- answer.o reroute.o hostname.o save.o unshar.o decode.o execute.o \
- pack_date.o pack_name.o pack_subject.o news.o digest.o match.o
-
- ! ACCT = account.o global.o options.o proto.o hostname.o
-
- MAIL = nnmail.o reroute.o hostname.o global.o options.o
-
-